﻿
#region 版权声明





//



// 
// 代码开源主要用于解决大家在学习和研究协议过程中遇到由于缺乏代码所带来的制约性问题。
// 本代码仅供学习交流使用，大家在使用此开发包前请自行协调好多方面关系，
// 不得用于任何商业用途和非法用途，本人不享受和承担由此产生的任何权利以及任何法律责任。
// 
// 本源代码可通过以下网址获取:
// http://www.vckers.com
//
// Copyright @ 2009-2010  vckers.com.  All Rights Reserved.   
// Framework: 3.5

  

 
//   
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details. 
  
#endregion

using System;
using System.Collections.Generic;
using System.Text;

using TS.QQ.Packets;
namespace TS.QQ.Events
{
    /// <summary>
    /// 包处理器
    /// </summary>
    public class ProcessorRouter
    {
        private List<IPacketListener> listeners;
        private QQClient client;
        public ProcessorRouter(QQClient client)
        {
            this.client = client;
            listeners = new List<IPacketListener>();
        }
        /// <summary>装载包处理器
    /// </summary>
        /// <param name="listener">The listener.</param>
        public void InstallProcessor(IPacketListener listener)
        {
            listeners.Add(listener);
        }
        public void PacketArrived(InPacket inPacket)
        {
            try
            {
                foreach (IPacketListener listener in listeners)
                {
                    if (listener.Accept(inPacket))
                    {
                        listener.PacketArrived(inPacket);
                        return;
                    }
                }
            }
            catch (Exception e)
            {
                client.LogManager.Log(ToString() + ":" + e.Message + "\n\r" + e.StackTrace);
                ErrorPacket errorPacket = new ErrorPacket(ErrorPacketType.RUNTIME_ERROR, client,e);
                errorPacket.ErrorMessage = client.GenerateCrashReport(e, inPacket);
                errorPacket.Family = ProtocolFamily.Basic;
                errorPacket.ConnectionId = TS.QQ.Net.QQPort.Main.Name;
                client.PacketManager.AddIncomingPacket(errorPacket, errorPacket.ConnectionId);
                
            }
        }
    }
}
